<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.staticfile.org/vue/3.0.5/vue.global.js"></script>
    <title>Document</title>
    <style>
        .red {
            color: red;
        }
        .blue{
            color: blue;
        }
    </style>
</head>

<body>

    <div id="app">

    </div>
    <template id="main">
        <div style="color: red;">
            {{main}}
            <firstvue></firstvue>

        </div>
    </template>
    <template id="first">
        <div style="color: blue;">
            {{first}}
            <br>
            firstNum : {{firstNum}}
            <twovue @firstevent="firstAdd"></twovue>
        </div>
    </template>
    <template id="two">
        <div>
            {{two}} <br>
            <div>调用父组件方法并传参</div>
            <!-- 子组件调用 this.$emit 方法调用父组件方法，第一个参数为需要调用的方法名称，第二个参数为函数传参 -->        
            <div class="blue">点击子组件，把修改的数据传递给父组件显示</div>
            <button @click="twoadd">点击</button>
            <br>
            twoNum: {{twoNum}}

        </div>
    </template>
</body>

<script>

    let twoconfig = {
        template: '#two',
        emits:['firstevent'],
        methods:{
            twoadd(){
                /**
                 * 事件“firstevent”在组件Twovue中发出，
                 * 但处理程序已注册为“firstevent”。请注意，
                 * HTML属性不区分大小写，在DOM模板中使用时不能使用v-on来侦听camelCase事件。
                 * 您可能应该使用“first event”而不是“firstEvent”。
                 * 
                 * @注意 在事件名称一般使用 小写字符。
                 **/
                this.$emit('firstevent',this.twoNum);
                this.twoNum++;
            }
        },
        data() {
            return {
                two: 'two info',
                twoNum:0
            }
        }
    };

    let firstconfig = {
        template: '#first',
        data() {
            return {
                first: 'first info',
                firstNum:0
            }
        },
        methods:{
            firstAdd(num){
                this.firstNum = num;
            }
        },
        components: {
            twovue: twoconfig
        }
    };

    let mainconfig = {
        template: '#main',
        data() {
            return {
                main: 'main info'
            }
        },
        components: {
            firstvue: firstconfig
        }
    };

    Vue.createApp(mainconfig).mount("#app");
    // Vue.createApp(firstconfig).mount("#app");
    // Vue.createApp(twoconfig).mount("#app");

</script>

</html>